package com.itguigu.glimail.ware.config;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class MyRabbitConfig {
    @Autowired
    RabbitTemplate rabbitTemplate;

    /**
     * 使用JSON序列化机制  进行消息转换
     * @return
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
//    @PostConstruct//对象创建完成以后 执行这个方法
//    /**
//     * *定制RabbitTemplate
//     * 1、服务收到消息就回调
//     * 本
//     * 1、spring. rabbitmq。publisher-confirms=true
//     * *
//     * 2、设置确认回调ConfirmCallback
//     * * 2、消息正确抵达队列进行回调
//     * 1、spring. rabbi tmq. publ isher-returns=true
//     * spring。rabbitmq. t empl ate . mandatory=true
//     * *
//     * 2、设置确认回调ReturnCallback
//     *
//     * * * 3.消费端确认(保证每个消息被正确消费，此时才可以broker删除这个消息)。
//     *      1、默认是自动确认的，只要消息接收到，客户端会自动确认，服务端就会移除这个消息
//     *  问题:
//     *  我们收到很多消息，自动回复给服务器ack, 只有一个消息处理成功，宕机了。|就会发生已接收的消息 丢失
//     * 解决: 手动确认 消费端处理成功在确认 只要我们没有明确告诉MQ，货物被签收。没有Ack,消息就一直是unacked状态.消息不会丢失,会重新变为ready,即使Consumer宕机。消息不会丢失，会重新变为Ready, 下一次有新的Consumer连接进来就发给他|
//     * 2.如何确认
//     * channel. basicAck(del iveryTag,false);签收;业务成功完成就应该签收
//     * channel. basicNack(del iveryTag,false, true);拒签;业务失败，拒签
//     *
//     */
//    public void initRabbitTemplate() {
//       rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//           /**
//            *只要消息抵达broker ack就是true
//            * @param correlationData //当前消息的唯一关联数据()这个消息的唯一id
//            * @param ack 消息是否成功收到
//            * @param cause @param cause失败的原因
//            */
//           @Override
//           public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//               System.out.println("confirm.....correlationData:"+correlationData+"");
//           }
//       });
//       rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
//           /**
//            *只要消息没有投递给指定的队列，就触发这个失败回调
//            * @param message 投递失败的消息详细信息
//            * @param replyCode 回复状态码
//            * @param replyText 回复的文本
//            * @param exchange  当时这个消息发给哪个交换机
//            * @param routingKey 当时这个消息用哪个路由键
//            */
//           @Override
//           public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
//
//           }
//       });
//    }

}
